home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1994 / 8 / 05 / term-4.0-source.lha / termAbout.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-26  |  11.9 KB  |  581 lines

  1. /*
  2. **    termAbout.c
  3. **
  4. **    Support routines for the `About' window.
  5. **
  6. **    Copyright © 1990-1994 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_FRAME=1,GAD_BUTTON };
  13.  
  14.     /* LocalDeleteBitMap(struct BitMap *BitMap,UWORD Width,UWORD Height):
  15.      *
  16.      *    Delete yet another screen bitmap.
  17.      */
  18.  
  19. STATIC VOID __regargs
  20. LocalDeleteBitMap(struct BitMap *BitMap,UWORD Width,UWORD Height)
  21. {
  22.     if(BitMap)
  23.     {
  24.         WORD i;
  25.  
  26.         WaitBlit();
  27.  
  28.         for(i = 0 ; i < BitMap -> Depth ; i++)
  29.         {
  30.             if(BitMap -> Planes[i])
  31.                 FreeRaster(BitMap -> Planes[i],Width,Height);
  32.         }
  33.  
  34.         FreeVecPooled(BitMap);
  35.     }
  36. }
  37.  
  38.     /* LocalCreateBitMap(UWORD Depth,UWORD Width,UWORD Height):
  39.      *
  40.      *    Create yet another screen bitmap.
  41.      */
  42.  
  43. STATIC struct BitMap * __regargs
  44. LocalCreateBitMap(UWORD Depth,UWORD Width,UWORD Height)
  45. {
  46.     struct BitMap *BitMap;
  47.  
  48.     if(BitMap = (struct BitMap *)AllocVecPooled(sizeof(struct BitMap),MEMF_ANY))
  49.     {
  50.         BYTE    Success = TRUE;
  51.         WORD    i;
  52.  
  53.         InitBitMap(BitMap,Depth,Width,Height);
  54.  
  55.         for(i = 0 ; Success && i < Depth ; i++)
  56.         {
  57.             if(!(BitMap -> Planes[i] = AllocRaster(Width,Height)))
  58.                 Success = FALSE;
  59.         }
  60.  
  61.         if(Success)
  62.             return(BitMap);
  63.  
  64.         LocalDeleteBitMap(BitMap,Width,Height);
  65.     }
  66.  
  67.     return(NULL);
  68. }
  69.  
  70.     /* CreateBitMapFromImage(struct Image *Image,struct BitMap *BitMap):
  71.      *
  72.      *    Turn an Intuition Image into a Gfx BitMap.
  73.      */
  74.  
  75. STATIC VOID __regargs
  76. CreateBitMapFromImage(struct Image *Image,struct BitMap *BitMap)
  77. {
  78.     PLANEPTR    Data    = (PLANEPTR)Image -> ImageData;
  79.     ULONG        Modulo    = ((((ULONG)Image -> Width) + 15) >> 3) & ~1;
  80.     WORD        i;
  81.  
  82.     InitBitMap(BitMap,Image -> Depth,Image -> Width,Image -> Height);
  83.  
  84.     for(i = 0 ; i < Image -> Depth ; i++, Data += Modulo * Image -> Height)
  85.         BitMap -> Planes[i] = Data;
  86. }
  87.  
  88.     /* RecolourBitMap():
  89.      *
  90.      *    Remap a BitMap to use a different colour selection.
  91.      */
  92.  
  93. STATIC struct BitMap * __regargs
  94. RecolourBitMap (struct BitMap *Src, UBYTE * Mapping, UBYTE DestDepth, UWORD Width, UWORD Height)
  95. {
  96.     struct BitMap *Dst;
  97.  
  98.         /* Create the bitmap to hold the remapped data. */
  99.  
  100.     if(Dst = LocalCreateBitMap(DestDepth,Width,Height))
  101.     {
  102.         struct BitMap *SingleMap;
  103.  
  104.             /* Create a single bitplane bitmap. */
  105.  
  106.         if(SingleMap = LocalCreateBitMap(1,Width,Height))
  107.         {
  108.             struct BitMap *FullMap;
  109.  
  110.                 /* Create a dummy bitmap. */
  111.  
  112.             if(FullMap = (struct BitMap *)AllocVecPooled(sizeof(struct BitMap),MEMF_ANY))
  113.             {
  114.                 WORD i,Mask = (1L << Src -> Depth) - 1;
  115.  
  116.                     /* Make the dummy bitmap use the
  117.                      * single bitmap in all planes.
  118.                      */
  119.  
  120.                 InitBitMap(FullMap,DestDepth,Width,Height);
  121.  
  122.                 for(i = 0 ; i < DestDepth ; i++)
  123.                     FullMap -> Planes[i] = SingleMap -> Planes[0];
  124.  
  125.                     /* Clear the destination bitmap. */
  126.  
  127.                 BltBitMap(Dst,0,0,Dst,0,0,Width,Height,MINTERM_ZERO,0xFF,NULL);
  128.  
  129.                     /* Is colour zero to be mapped to a non-zero colour? */
  130.  
  131.                 if(Mapping[0])
  132.                 {
  133.                         /* Clear the single plane bitmap. */
  134.  
  135.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_ZERO,1,NULL);
  136.  
  137.                         /* Merge all source bitplane data. */
  138.  
  139.                     BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_B_OR_C,Mask,NULL);
  140.  
  141.                         /* Invert the single plane bitmap, to give us
  142.                          * the zero colour bitmap we can work with.
  143.                          */
  144.  
  145.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_NOT_C,1,NULL);
  146.  
  147.                         /* Now set all the bits for colour zero. */
  148.  
  149.                     BltBitMap(FullMap,0,0,Dst,0,0,Width,Height,MINTERM_B_OR_C,Mapping[0],NULL);
  150.                 }
  151.  
  152.                     /* Run down the colours. */
  153.  
  154.                 for(i = 1 ; i <= Mask ; i++)
  155.                 {
  156.                         /* Set the single plane bitmap to all 1's. */
  157.  
  158.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_ONE,1,NULL);
  159.  
  160.                         /* Isolate the pixels to match the colour
  161.                          * specified in `i'.
  162.                          */
  163.  
  164.                     BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_B_AND_C,i,NULL);
  165.  
  166.                     if(Mask ^ i)
  167.                         BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_NOT_B_AND_C,Mask ^ i,NULL);
  168.  
  169.                         /* Set the pixels in the destination bitmap,
  170.                          * use the designated colour.
  171.                          */
  172.  
  173.                     BltBitMap(FullMap,0,0,Dst,0,0,Width,Height,MINTERM_B_OR_C,Mapping[i],NULL);
  174.                 }
  175.  
  176.                     /* Free the temporary bitmap. */
  177.  
  178.                 FreeVecPooled(FullMap);
  179.  
  180.                     /* Free the single plane bitmap. */
  181.  
  182.                 LocalDeleteBitMap(SingleMap,Width,Height);
  183.  
  184.                     /* Return the result. */
  185.  
  186.                 return(Dst);
  187.             }
  188.  
  189.             LocalDeleteBitMap(SingleMap,Width,Height);
  190.         }
  191.  
  192.         LocalDeleteBitMap(Dst,Width,Height);
  193.     }
  194.  
  195.     return(NULL);
  196. }
  197.  
  198.     /* ShowAbout():
  199.      *
  200.      *    Open a window, draw the `term' logo, show some text
  201.      *    and wait for user reaction.
  202.      */
  203.  
  204. BYTE __regargs
  205. ShowAbout(BYTE Ticks)
  206. {
  207.     struct BitMap        *ImageBitMap = NULL;
  208.     LONG             ImageWidth,
  209.                  ImageHeight;
  210.     BYTE             GotRexxMessage = FALSE;
  211.     struct LayoutHandle    *Handle;
  212.  
  213.     if(IconBase)
  214.     {
  215.         struct DiskObject *Icon;
  216.  
  217.         if(Icon = GetProgramIcon())
  218.         {
  219.             STATIC UWORD DefaultColours[4] =
  220.             {
  221.                 0xAAA,
  222.                 0x000,
  223.                 0xFFF,
  224.                 0x68B
  225.             };
  226.  
  227.             UBYTE    Mapping[4];
  228.             UWORD    Colour1,Colour2;
  229.             WORD    ChannelDistance;
  230.             LONG    Distance,BestDistance,BestIndex,Depth,Count,i,j;
  231.             BOOLEAN    Duplicates = FALSE;
  232.  
  233.             if(Kick30)
  234.                 Depth = GetBitMapAttr(Window -> RPort -> BitMap,BMA_DEPTH);
  235.             else
  236.                 Depth = Window -> RPort -> BitMap -> Depth;
  237.  
  238.             Count = Window -> WScreen -> ViewPort . ColorMap -> Count;
  239.  
  240.             if(Count > (1L << Depth))
  241.                 Count = 1L << Depth;
  242.  
  243.             if(Count >= 4)
  244.             {
  245.                 for(i = 0 ; i < 4 ; i++)
  246.                 {
  247.                     Colour2 = DefaultColours[i];
  248.  
  249.                     BestDistance    = 3 * 15 * 15;
  250.                     BestIndex    = 0;
  251.  
  252.                     for(j = 0 ; j < Count ; j++)
  253.                     {
  254.                         Colour1 = GetRGB4(Window -> WScreen -> ViewPort . ColorMap,j);
  255.  
  256.                         ChannelDistance = ((WORD)((Colour1 >> 8) & 0xF)) - ((WORD)((Colour2 >> 8) & 0xF));
  257.  
  258.                         Distance = ChannelDistance * ChannelDistance;
  259.  
  260.                         ChannelDistance = ((WORD)((Colour1 >> 4) & 0xF)) - ((WORD)((Colour2 >> 4) & 0xF));
  261.  
  262.                         Distance += ChannelDistance * ChannelDistance;
  263.  
  264.                         ChannelDistance = ((WORD)(Colour1 & 0xF)) - ((WORD)(Colour2 & 0xF));
  265.  
  266.                         Distance += ChannelDistance * ChannelDistance;
  267.  
  268.                         if(Distance < BestDistance)
  269.                         {
  270.                             BestDistance    = Distance;
  271.                             BestIndex    = j;
  272.                         }
  273.                     }
  274.  
  275.                     Mapping[i] = BestIndex;
  276.                 }
  277.  
  278.                 for(i = 0 ; !Duplicates && i < 4 ; i++)
  279.                 {
  280.                     for(j = i + 1 ; !Duplicates && j < 4 ; j++)
  281.                         Duplicates = (Mapping[i] == Mapping[j]);
  282.                 }
  283.  
  284.                 if(!Duplicates)
  285.                 {
  286.                     struct BitMap     LocalBitMap;
  287.                     struct Image    *Image;
  288.  
  289.                     Image = Icon -> do_Gadget . GadgetRender;
  290.  
  291.                     if(Image -> Depth == 2)
  292.                     {
  293.                         CreateBitMapFromImage(Image,&LocalBitMap);
  294.  
  295.                         if(ImageBitMap = RecolourBitMap(&LocalBitMap,Mapping,Depth,Image -> Width,Image -> Height))
  296.                         {
  297.                             ImageWidth    = Image -> Width;
  298.                             ImageHeight    = Image -> Height;
  299.                         }
  300.                     }
  301.                 }
  302.             }
  303.  
  304.             FreeDiskObject(Icon);
  305.         }
  306.     }
  307.  
  308.     if(Handle = LT_CreateHandleTags(Window -> WScreen,
  309.         LH_LocaleHook,    &LocaleHook,
  310.         LH_ExactClone,    TRUE,
  311.     TAG_DONE))
  312.     {
  313.         STRPTR         AboutLines[3],
  314.                  RequestLines[4],
  315.                  StandardMail[4],
  316.                  ElectronicMail[2];
  317.         struct Window    *Window;
  318.         WORD         i;
  319.  
  320.         for(i = 0 ; i < 2 ; i++)
  321.             AboutLines[i] = LocaleString(MSG_TERMINFO_INFOTEXT1_TXT + i);
  322.  
  323.         AboutLines[i] = NULL;
  324.  
  325.         for(i = 0 ; i < 3 ; i++)
  326.             RequestLines[i] = LocaleString(MSG_TERMINFO_INFOTEXT4_TXT + i);
  327.  
  328.         RequestLines[i] = NULL;
  329.  
  330.         for(i = 0 ; i < 3 ; i++)
  331.             StandardMail[i] = LocaleString(MSG_TERMINFO_INFOTEXT10_TXT + i);
  332.  
  333.         StandardMail[i] = NULL;
  334.  
  335.         for(i = 0 ; i < 1 ; i++)
  336.             ElectronicMail[i] = LocaleString(MSG_TERMINFO_INFOTEXT16_TXT + i);
  337.  
  338.         ElectronicMail[i] = NULL;
  339.  
  340.         LT_New(Handle,
  341.             LA_Type,    VERTICAL_KIND,
  342.         TAG_DONE);
  343.         {
  344.             LT_New(Handle,
  345.                 LA_Type,    VERTICAL_KIND,
  346.                 LA_LabelText,    TermName,
  347.             TAG_DONE);
  348.             {
  349.                 if(ImageBitMap)
  350.                 {
  351.                     LT_New(Handle,
  352.                         LA_Type,    VERTICAL_KIND,
  353.                     TAG_DONE);
  354.                     {
  355.                         LT_New(Handle,
  356.                             LA_Type,        FRAME_KIND,
  357.                             LAFR_InnerWidth,    ImageWidth,
  358.                             LAFR_InnerHeight,    ImageHeight,
  359.                             LA_DrawBox,        FALSE,
  360.                             LA_ID,            GAD_FRAME,
  361.                         TAG_DONE);
  362.  
  363.                         LT_EndGroup(Handle);
  364.                     }
  365.                 }
  366.  
  367.                 LT_New(Handle,
  368.                     LA_Type,    VERTICAL_KIND,
  369.                 TAG_DONE);
  370.                 {
  371.                     LT_New(Handle,
  372.                         LA_Type,    BOX_KIND,
  373.                         LA_Chars,    56,
  374.                         LABX_Lines,    AboutLines,
  375.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  376.                         LABX_DrawBox,    FALSE,
  377.                     TAG_DONE);
  378.  
  379.                     LT_EndGroup(Handle);
  380.                 }
  381.  
  382.                 LT_EndGroup(Handle);
  383.             }
  384.  
  385.             LT_New(Handle,
  386.                 LA_Type,    VERTICAL_KIND,
  387.                 LA_LabelID,    MSG_V36_1030,
  388.             TAG_DONE);
  389.             {
  390.                 LT_New(Handle,
  391.                     LA_Type,    VERTICAL_KIND,
  392.                 TAG_DONE);
  393.                 {
  394.                     LT_New(Handle,
  395.                         LA_Type,    BOX_KIND,
  396.                         LA_Chars,    56,
  397.                         LABX_Lines,    RequestLines,
  398.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  399.                         LABX_DrawBox,    FALSE,
  400.                     TAG_DONE);
  401.  
  402.                     LT_EndGroup(Handle);
  403.                 }
  404.  
  405.                 LT_New(Handle,
  406.                     LA_Type,    VERTICAL_KIND,
  407.                     LA_LabelID,    MSG_V36_1031,
  408.                 TAG_DONE);
  409.                 {
  410.                     LT_New(Handle,
  411.                         LA_Type,    BOX_KIND,
  412.                         LA_Chars,    56,
  413.                         LABX_Lines,    StandardMail,
  414.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  415.                         LABX_DrawBox,    FALSE,
  416.                     TAG_DONE);
  417.  
  418.                     LT_EndGroup(Handle);
  419.                 }
  420.  
  421.                 LT_New(Handle,
  422.                     LA_Type,    VERTICAL_KIND,
  423.                     LA_LabelID,    MSG_V36_1032,
  424.                 TAG_DONE);
  425.                 {
  426.                     LT_New(Handle,
  427.                         LA_Type,    BOX_KIND,
  428.                         LA_Chars,    56,
  429.                         LABX_Lines,    ElectronicMail,
  430.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  431.                         LABX_DrawBox,    FALSE,
  432.                     TAG_DONE);
  433.  
  434.                     LT_EndGroup(Handle);
  435.                 }
  436.  
  437.                 LT_EndGroup(Handle);
  438.             }
  439.  
  440.             if(!Ticks)
  441.             {
  442.                 LT_New(Handle,
  443.                     LA_Type,VERTICAL_KIND,
  444.                 TAG_DONE);
  445.                 {
  446.                     LT_New(Handle,LA_Type,XBAR_KIND,LAXB_FullSize,TRUE,TAG_DONE);
  447.  
  448.                     LT_New(Handle,
  449.                         LA_Type,    BUTTON_KIND,
  450.                         LA_LabelID,    MSG_V36_1033,
  451.                         LA_ID,        GAD_BUTTON,
  452.                         LABT_ReturnKey,    TRUE,
  453.                         LABT_ExtraFat,    TRUE,
  454.                     TAG_DONE);
  455.  
  456.                     LT_EndGroup(Handle);
  457.                 }
  458.             }
  459.  
  460.             LT_EndGroup(Handle);
  461.         }
  462.  
  463.         if(!Ticks)
  464.         {
  465.             Window = LT_Layout(Handle,LocaleString(MSG_V36_1034),NULL,0,0,IDCMP_CLOSEWINDOW,0,
  466.                 LAWN_HelpHook,        &GuideHook,
  467.                 LAWN_MaxPen,        0,
  468.                 WA_DepthGadget,        TRUE,
  469.                 WA_CloseGadget,        TRUE,
  470.                 WA_DragBar,        TRUE,
  471.                 WA_RMBTrap,        TRUE,
  472.                 WA_Activate,        TRUE,
  473.             TAG_DONE);
  474.         }
  475.         else
  476.         {
  477.             Window = LT_Layout(Handle,NULL,NULL,0,0,IDCMP_RAWKEY | IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_INTUITICKS,0,
  478.                 LAWN_HelpHook,        &GuideHook,
  479.                 WA_RMBTrap,        TRUE,
  480.                 WA_Activate,        TRUE,
  481.                 WA_ReportMouse,        TRUE,
  482.                 WA_GimmeZeroZero,    TRUE,
  483.             TAG_DONE);
  484.         }
  485.  
  486.         if(Window)
  487.         {
  488.             struct IntuiMessage    *Message;
  489.             BOOLEAN             Done = FALSE;
  490.             ULONG             MsgClass,
  491.                          MsgQualifier;
  492.             UWORD             MsgCode;
  493.             struct Gadget        *MsgGadget;
  494.             ULONG             Signals;
  495.             LONG             TickCount = 0;
  496.  
  497.             if(ImageBitMap)
  498.             {
  499.                 LONG Left,Top;
  500.  
  501.                 LT_GetAttributes(Handle,GAD_FRAME,
  502.                     LA_Left,    &Left,
  503.                     LA_Top,        &Top,
  504.                 TAG_DONE);
  505.  
  506.                 BltBitMapRastPort(ImageBitMap,0,0,Window -> RPort,Left,Top,ImageWidth,ImageHeight,MINTERM_COPY);
  507.             }
  508.  
  509.             while(Message = GT_GetIMsg(Window -> UserPort))
  510.                 GT_ReplyIMsg(Message);
  511.  
  512.             if(!Ticks)
  513.             {
  514.                 GuideContext(CONTEXT_COMMAND);
  515.  
  516.                 PushWindow(Window);
  517.             }
  518.             else
  519.                 Say(LocaleString(MSG_TERMINFO_WELCOME_TO_TERM_TXT));
  520.  
  521.             do
  522.             {
  523.                 Signals = Wait(PORTMASK(Window -> UserPort) | SIG_BREAK | SIG_REXX);
  524.  
  525.                 if(Signals & SIG_BREAK)
  526.                     break;
  527.  
  528.                 if(Ticks)
  529.                 {
  530.                     if(Signals & SIG_REXX)
  531.                     {
  532.                         GotRexxMessage = TRUE;
  533.  
  534.                         break;
  535.                     }
  536.                 }
  537.  
  538.                 while(Message = (struct IntuiMessage *)GT_GetIMsg(Window -> UserPort))
  539.                 {
  540.                     MsgClass    = Message -> Class;
  541.                     MsgQualifier    = Message -> Qualifier;
  542.                     MsgCode        = Message -> Code;
  543.                     MsgGadget    = (struct Gadget *)Message -> IAddress;
  544.  
  545.                     GT_ReplyIMsg(Message);
  546.  
  547.                     if(Ticks)
  548.                     {
  549.                         if(MsgClass == IDCMP_INTUITICKS && TickCount++ >= 50)
  550.                             Done = TRUE;
  551.  
  552.                         if((MsgClass == IDCMP_RAWKEY || MsgClass == IDCMP_MOUSEBUTTONS) && !(MsgCode & IECODE_UP_PREFIX))
  553.                             Done = TRUE;
  554.  
  555.                         if(MsgClass == IDCMP_MOUSEMOVE)
  556.                             Done = TRUE;
  557.                     }
  558.                     else
  559.                     {
  560.                         LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
  561.  
  562.                         if(MsgClass == IDCMP_CLOSEWINDOW || MsgClass == IDCMP_GADGETUP)
  563.                             Done = TRUE;
  564.                     }
  565.                 }
  566.             }
  567.             while(!Done);
  568.  
  569.             if(!Ticks)
  570.                 PopWindow();
  571.         }
  572.  
  573.         LT_DeleteHandle(Handle);
  574.     }
  575.  
  576.     if(ImageBitMap)
  577.         LocalDeleteBitMap(ImageBitMap,ImageWidth,ImageHeight);
  578.  
  579.     return(GotRexxMessage);
  580. }
  581.